package com.ytjj.common.service;

import com.alibaba.fastjson.JSONObject;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import com.ytjj.common.api.CommonResult;
import com.ytjj.common.constants.WxConstants;
import com.ytjj.common.utils.HttpClientUtil;
import com.ytjj.common.utils.WXAppConfigUtil;
import com.ytjj.common.utils.WXAppletConfigUtil;
import com.ytjj.common.utils.WXH5ConfigUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 *
 * @version 1.0
 *
 */
@Service
@Slf4j
public class WxService {

    @Autowired
    private WxConstants wxConstants;

    @Resource
    private WXAppConfigUtil wxConfigUtil;

    @Resource
    private WXAppletConfigUtil wxAppletConfigUtil;

    @Resource
    private WXH5ConfigUtil wxh5ConfigUtil;


//    /**
//     * 内容敏感词过滤
//     *
//     * @param accessToken
//     * @param content
//     * @return
//     */
//    public JSONObject msgSecCheck(String accessToken, String content) {
//        JSONObject param = new JSONObject();
//        param.put("content", content);
//        log.info("微信内容敏感词校验请求 ：{}", param.toString());
//        // 发送请求
//        String wxResult = HttpClientUtil.doPostJson(wxConstants.getWX_APPLET_MSGSECCHECK_URL() + accessToken, param.toJSONString());
//        log.info("微信内容敏感词校验响应 ：{}", wxResult);
//        JSONObject jsonObject = JSONObject.parseObject(wxResult);
//        return jsonObject;
//    }

    /**
     * APP退款
     *
     * @param outTradeNo
     * @param outRefundNo
     */
    public Map refundOrders(String outTradeNo, String outRefundNo, Integer totalFee, Integer refundFee,
                             String refundDesc) throws Exception {
        Map<String, String> data = new HashMap<>();
        //生成商户订单号，不可重复
        WXPay wxpay = new WXPay(wxConfigUtil, WXPayConstants.SignType.MD5);
        data.put("appid", wxConstants.getWX_APP_ID());
        data.put("mch_id", wxConfigUtil.getMchID());
        data.put("nonce_str", WXPayUtil.generateNonceStr());
        data.put("out_trade_no", outTradeNo);
        data.put("out_refund_no", outRefundNo);
        data.put("total_fee", String.valueOf(totalFee));
        data.put("refund_fee", String.valueOf(refundFee));
        data.put("refund_desc", refundDesc);
        data.put("notify_url", wxConstants.getAPP_REFUND_NOTIFY_URL());
        data.put("sign", WXPayUtil.generateSignature(data, wxConfigUtil.getKey(),
                WXPayConstants.SignType.MD5));
        Map<String, String> response = wxpay.refund(data);
        log.info("微信发起退款：response:{}",JSONObject.toJSONString(response));
        return response;
    }

    /**
     * 小程序退款
     *
     * @param outTradeNo
     * @param outRefundNo
     */
    public Map refundOrdersV2(String outTradeNo, String outRefundNo, Integer totalFee, Integer refundFee,
                            String refundDesc) throws Exception {
        Map<String, String> data = new HashMap<>();
        //生成商户订单号，不可重复
        WXPay wxpay = new WXPay(wxAppletConfigUtil, WXPayConstants.SignType.MD5);
        data.put("appid", wxConstants.getWX_APPLET_APPID());
        data.put("mch_id", wxConfigUtil.getMchID());
        data.put("nonce_str", WXPayUtil.generateNonceStr());
        data.put("out_trade_no", outTradeNo);
        data.put("out_refund_no", outRefundNo);
        data.put("total_fee", String.valueOf(totalFee));
        data.put("refund_fee", String.valueOf(refundFee));
        data.put("refund_desc", refundDesc);
        data.put("notify_url", wxConstants.getAPP_REFUND_NOTIFY_URL());
        data.put("sign", WXPayUtil.generateSignature(data, wxConfigUtil.getKey(),
                WXPayConstants.SignType.MD5));
        Map<String, String> response = wxpay.refund(data);
        log.info("微信发起退款：response:{}",JSONObject.toJSONString(response));
        return response;
    }

//    /**
//     * 生成app付款信息
//     *
//     * @param orderNo
//     * @return
//     * @throws Exception
//     */
//    public Map doUnifiedOrder(String orderNo, String totalFee, String type, String openid, String body) throws Exception {
//        try {
//            WXPay wxpay;
//            Map<String, String> data = new HashMap<>();
//            //生成商户订单号，不可重复
//            data.put("appid", wxConstants.getWX_APP_ID());
//            //异步通知地址（请注意必须是外网）
//            data.put("notify_url", wxConstants.getAPP_NOTIFY_URL());
//            //附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
//            data.put("attach", "");
//            if (wxConstants.getIsSandBox().equals("1")) {
//                wxpay = new WXPay(wxConfigUtil, WXPayConstants.SignType.MD5, true);
//            } else {
//                wxpay = new WXPay(wxConfigUtil, WXPayConstants.SignType.MD5);
//
//            }
//            data.put("mch_id", wxConfigUtil.getMchID());
//            if (wxConstants.getIsSandBox().equals("1")) {
//                data.put("cash_fee", "201");
//            }
//            data.put("nonce_str", WXPayUtil.generateNonceStr());
//            data.put("body", body);
//            data.put("out_trade_no", orderNo);
//            data.put("total_fee", totalFee);
//            //自己的服务器IP地址
//            data.put("spbill_create_ip", wxConstants.getSPBILL_CREATE_IP());
//            //交易类型
//            data.put("trade_type", type);
//            data.put("sign", WXPayUtil.generateSignature(data, wxConfigUtil.getKey(),
//                    WXPayConstants.SignType.MD5));
//            //使用官方API请求预付订单
//            Map<String, String> response = wxpay.unifiedOrder(data);
//            System.out.println(response);
//            if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数
//                Map<String, String> param = new HashMap<>();
//                param.put("appid", wxConstants.getWX_APP_ID());
//                param.put("partnerid", response.get("mch_id"));
//                param.put("prepayid", response.get("prepay_id"));
//                param.put("package", "Sign=WXPay");
//                param.put("noncestr", WXPayUtil.generateNonceStr());
//                param.put("timestamp", System.currentTimeMillis() / 1000 + "");
//                param.put("sign", WXPayUtil.generateSignature(param, wxConfigUtil.getKey(),
//                        WXPayConstants.SignType.MD5));
//                return param;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new Exception("下单失败");
//        }
//        throw new Exception("下单失败");
//    }

//    /**
//     * 生成微信小程序付款信息
//     *
//     * @param orderNo
//     * @return
//     * @throws Exception
//     */
//    public Map doUnifiedOrderV2(String orderNo, String totalFee, String type, String openid, String body) throws Exception {
//        try {
//            WXPay wxpay;
//            Map<String, String> data = new HashMap<>();
//            //生成商户订单号，不可重复
//            data.put("appid", wxConstants.getWX_APPLET_APPID());
//            data.put("attach", "");
//            data.put("body", body);
//            data.put("mch_id", wxConfigUtil.getMchID());
//            data.put("nonce_str", WXPayUtil.generateNonceStr());
//            data.put("notify_url", wxConstants.getWX_APPLET_NOTIFY_URL());
//            data.put("openid", openid);
//            data.put("out_trade_no", orderNo);
//            data.put("spbill_create_ip", wxConstants.getSPBILL_CREATE_IP());
//            data.put("total_fee", totalFee);
//            data.put("trade_type", type);
//            //异步通知地址（请注意必须是外网）
//            wxpay = new WXPay(wxAppletConfigUtil, WXPayConstants.SignType.MD5);
//            data.put("sign", WXPayUtil.generateSignature(data, wxConfigUtil.getKey(),
//                    WXPayConstants.SignType.MD5));
//            //使用官方API请求预付订单
//            Map<String, String> response = wxpay.unifiedOrder(data);
//            System.out.println(response);
//            if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数
//                Map<String, String> param = new HashMap<>();
//                param.put("appId", wxConstants.getWX_APPLET_APPID());
//                param.put("nonceStr", WXPayUtil.generateNonceStr());
//                param.put("package", "prepay_id=" + response.get("prepay_id"));
//                param.put("signType", "MD5");
//                param.put("timeStamp", System.currentTimeMillis() / 1000 + "");
//                param.put("sign", WXPayUtil.generateSignature(param, wxConfigUtil.getKey(),
//                        WXPayConstants.SignType.MD5));
//                return param;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new Exception("下单失败");
//        }
//        throw new Exception("下单失败");
//    }


//    /**
//     * 生成h5付款信息
//     *
//     * @param orderNo
//     * @return
//     * @throws Exception
//     */
//    public Map doUnifiedOrderH5(String orderNo, String totalFee, String type, String body,String attach) throws Exception {
//        try {
//            WXPay wxpay;
//            Map<String, String> data = new HashMap<>();
//            //生成商户订单号，不可重复
//            data.put("appid", wxConstants.getWX_MWEB_APPID());
//            data.put("attach", attach);
//            data.put("body", body);
//            data.put("mch_id", wxh5ConfigUtil.getMchID());
//            data.put("nonce_str", WXPayUtil.generateNonceStr());
//            data.put("notify_url", wxConstants.getH5_NOTIFY_URL());
//            data.put("out_trade_no", orderNo);
//            data.put("spbill_create_ip", wxConstants.getSPBILL_CREATE_IP());
//            data.put("total_fee", totalFee);
//            data.put("trade_type", type);
//            data.put("scene_info","{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"http://www.quanminyanxuan.com\",\"wap_name\": \"XXXX优品\"}}");
//            //异步通知地址（请注意必须是外网）
//            wxpay = new WXPay(wxh5ConfigUtil, WXPayConstants.SignType.MD5);
//            data.put("sign", WXPayUtil.generateSignature(data, wxh5ConfigUtil.getKey(),
//                    WXPayConstants.SignType.MD5));
//            //使用官方API请求预付订单
//            Map<String, String> response = wxpay.unifiedOrder(data);
//            System.out.println(response);
//            if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数
//                Map<String, String> param = new HashMap<>();
//                param.put("mweb_url",response.get("mweb_url"));
//                return param;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new Exception("下单失败");
//        }
//        throw new Exception("下单失败");
//    }

//    /**
//     * 生成h5微信内JSAPI付款信息
//     *
//     * @param orderNo
//     * @return
//     * @throws Exception
//     */
//    public Map doUnifiedOrderJsApi(String orderNo, String totalFee, String type, String body,String attach,String openid) throws Exception {
//        try {
//            WXPay wxpay;
//            Map<String, String> data = new HashMap<>();
//            //生成商户订单号，不可重复
//            data.put("appid", wxConstants.getWX_MWEB_APPID());
//            data.put("attach", attach);
//            data.put("body", body);
//            data.put("mch_id", wxh5ConfigUtil.getMchID());
//            data.put("nonce_str", WXPayUtil.generateNonceStr());
//            data.put("notify_url", wxConstants.getH5_NOTIFY_URL());
//            data.put("out_trade_no", orderNo);
//            data.put("spbill_create_ip", wxConstants.getSPBILL_CREATE_IP());
//            data.put("total_fee", totalFee);
//            data.put("openid",openid);
//            data.put("trade_type", type);
//            //异步通知地址（请注意必须是外网）
//            wxpay = new WXPay(wxh5ConfigUtil, WXPayConstants.SignType.MD5);
//            data.put("sign", WXPayUtil.generateSignature(data, wxh5ConfigUtil.getKey(),
//                    WXPayConstants.SignType.MD5));
//            //使用官方API请求预付订单
//            Map<String, String> response = wxpay.unifiedOrder(data);
//            System.out.println(response);
//            if ("SUCCESS".equals(response.get("return_code"))) {//主要返回以下5个参数
//                Map<String, String> param = new HashMap<>();
//                param.put("appId", wxConstants.getWX_MWEB_APPID());
//                param.put("nonceStr", WXPayUtil.generateNonceStr());
//                param.put("package", "prepay_id=" + response.get("prepay_id"));
//                param.put("signType", "MD5");
//                param.put("timeStamp", System.currentTimeMillis() / 1000 + "");
//                param.put("sign", WXPayUtil.generateSignature(param, wxh5ConfigUtil.getKey(),
//                        WXPayConstants.SignType.MD5));
//                return param;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new Exception("下单失败");
//        }
//        throw new Exception("下单失败");
//    }


//    /**
//     * 微信app订单查询
//     *
//     * @param outTradeNo
//     * @return
//     * @throws Exception
//     */
//    public Map wxAppOrderQuery(String outTradeNo, String type) throws Exception {
//        WXPay wxpay;
//        Map<String, String> data = new HashMap<>();
//        //生成商户订单号，不可重复
//        if ("APP".equals(type)) {
//            data.put("appid", wxConstants.getWX_APP_ID());
//        }else if("MWEB".equals(type)){
//            data.put("appid", wxConstants.getWX_MWEB_APPID());
//        } else {
//            data.put("appid", wxConstants.getWX_APPLET_APPID());
//        }
//
//        if (wxConstants.getIsSandBox().equals("1")) {
//            if ("APP".equals(type)) {
//                wxpay = new WXPay(wxConfigUtil, WXPayConstants.SignType.MD5, true);
//            } else {
//                wxpay = new WXPay(wxAppletConfigUtil, WXPayConstants.SignType.MD5, true);
//            }
//        } else {
//            if ("APP".equals(type)) {
//                wxpay = new WXPay(wxConfigUtil, WXPayConstants.SignType.MD5);
//            } else {
//                wxpay = new WXPay(wxAppletConfigUtil, WXPayConstants.SignType.MD5);
//            }
//        }
//
//        data.put("mch_id", wxConfigUtil.getMchID());
//        data.put("out_trade_no", outTradeNo);
//        data.put("nonce_str", WXPayUtil.generateNonceStr());
//        data.put("sign", WXPayUtil.generateSignature(data, wxConfigUtil.getKey(),
//                WXPayConstants.SignType.MD5));
//        log.info("微信app支付状态查询请求 订单号：{},query: {}", outTradeNo, JSONObject.toJSONString(data));
//        //使用官方API请求预付订单
//        Map<String, String> response = wxpay.orderQuery(data);
//        log.info("微信app支付状态查询响应 订单号：{},response: {}", outTradeNo, JSONObject.toJSONString(response));
//        return response;
//    }

    /**
     * 获取沙箱key
     *
     * @throws Exception
     */
    public void tdoGetSandboxSignKey() throws Exception {
        HashMap<String, String> data = new HashMap<String, String>();
        // 商户号
        data.put("mch_id", wxConfigUtil.getMchID());
        // 获取随机字符串
        data.put("nonce_str", WXPayUtil.generateNonceStr());
        // 生成签名
        String sign = WXPayUtil.generateSignature(data, wxConfigUtil.getKey());
        data.put("sign", sign);
        // 得到 sandbox_signkey
        WXPay wxPay = new WXPay(wxAppletConfigUtil);
        String result = wxPay.requestWithoutCert("https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey", data, 10000, 10000);
        System.out.println(result);
    }

//    public Map<String,Object> getJsSdk(String jsapiTicket,String url) {
//        Map<String,Object> data = new HashMap<>();
//        data.put("timestamp",System.currentTimeMillis() / 1000 + "");
//        data.put("nonceStr", WXPayUtil.generateNonceStr());
//        data.put("appId",wxh5ConfigUtil.getAppID());
//        data.put("signature",SHA1("jsapi_ticket="+jsapiTicket
//                +"&noncestr="+data.get("nonceStr")
//                +"&timestamp="+data.get("timestamp")
//                +"&url="+url));
//        List<String> jsList = Arrays.asList("updateAppMessageShareData",
//                "updateTimelineShareData",
//                "onMenuShareTimeline",
//                "onMenuShareAppMessage",
//                "onMenuShareQQ",
//                "onMenuShareWeibo",
//                "onMenuShareQZone",
//                "startRecord",
//                "stopRecord",
//                "onVoiceRecordEnd",
//                "playVoice",
//                "pauseVoice",
//                "stopVoice",
//                "onVoicePlayEnd",
//                "uploadVoice",
//                "downloadVoice",
//                "chooseImage",
//                "previewImage",
//                "uploadImage",
//                "downloadImage",
//                "translateVoice",
//                "getNetworkType",
//                "openLocation",
//                "getLocation",
//                "hideOptionMenu",
//                "showOptionMenu",
//                "hideMenuItems",
//                "showMenuItems",
//                "hideAllNonBaseMenuItem",
//                "showAllNonBaseMenuItem",
//                "closeWindow",
//                "scanQRCode",
//                "chooseWXPay",
//                "openProductSpecificView",
//                "addCard",
//                "chooseCard",
//                "openCard");
//        data.put("jsApiList",jsList);
//        return data;
//    }
//
//    public static String SHA1(String decript) {
//        try {
//            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
//            digest.update(decript.getBytes());
//            byte messageDigest[] = digest.digest();
//            // Create Hex String
//            StringBuffer hexString = new StringBuffer();
//            // 字节数组转换为 十六进制 数
//            for (int i = 0; i < messageDigest.length; i++) {
//                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
//                if (shaHex.length() < 2) {
//                    hexString.append(0);
//                }
//                hexString.append(shaHex);
//            }
//            return hexString.toString();
//
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//        }
//        return "";
//    }
}
